package com.reliable.api.dto.excel;

import com.alibaba.excel.annotation.ExcelProperty;
import com.alibaba.excel.annotation.format.DateTimeFormat;
import com.alibaba.excel.annotation.write.style.ColumnWidth;
import com.alibaba.excel.annotation.write.style.ContentRowHeight;
import com.alibaba.excel.annotation.write.style.HeadRowHeight;
import com.reliable.api.dto.es.taskinfo.ScreenInfoDto;
import lombok.Data;

import java.util.Date;

/**
 * @author yuyantao
 * ClassName: AccessLogExcel
 * date: 2025/9/9 14:53
 *
 * 专用于 Excel 导出的数据传输对象 (DTO)
 * 该类将复杂的 ScreenInfoDto 对象转换为字符串，并优化了封禁标识的显示。
 */
@Data
@HeadRowHeight(20) // 表头行高
@ContentRowHeight(18) // 内容行高
public class AccessLogExcel {

    /**
     * 时间戳
     */
    @ExcelProperty("创建时间")
    @DateTimeFormat("yyyy-MM-dd HH:mm:ss") // 指定日期在Excel中的显示格式
    @ColumnWidth(20)
    private Date createTime;

    /**
     * 受害者id
     */
    @ExcelProperty("受害者ID")
    @ColumnWidth(40)
    private String victimId;

    /**
     * 来源 IP
     */
    @ExcelProperty("源IP")
    @ColumnWidth(15)
    private String sourceIp;

    /**
     * 来源 IP 归属地
     */
    @ExcelProperty("源IP位置")
    @ColumnWidth(25)
    private String sourceIpLocation;

    /**
     * WebRTC IP
     */
    @ExcelProperty("WebRTC IP")
    @ColumnWidth(15)
    private String webRtcIp;

    /**
     * WebRTC IP 归属地（可选）
     */
    @ExcelProperty("WebRTC IP位置")
    @ColumnWidth(25)
    private String webRtcIpLocation;

    /**
     * 域名
     */
    @ExcelProperty("域名")
    @ColumnWidth(20)
    private String domain;

    /**
     * 完整 URL
     */
    @ExcelProperty("完整URL")
    @ColumnWidth(50)
    private String fullUrl;

    /**
     * 页面标题
     */
    @ExcelProperty("页面标题")
    @ColumnWidth(30)
    private String title;

    /**
     * Referer
     */
    @ExcelProperty("来源页")
    @ColumnWidth(50)
    private String referer;

    /**
     * Cookie
     */
    @ExcelProperty("Cookie")
    @ColumnWidth(50)
    private String cookie;

    /**
     * 浏览器名称+版本
     */
    @ExcelProperty("浏览器版本")
    @ColumnWidth(20)
    private String browserVersion;

    /**
     * 操作系统+版本
     */
    @ExcelProperty("操作系统")
    @ColumnWidth(20)
    private String osVersion;

    /**
     * 设备类型
     */
    @ExcelProperty("设备类型")
    @ColumnWidth(15)
    private String deviceType;

    /**
     * 设备内存
     */
    @ExcelProperty("设备内存")
    @ColumnWidth(10)
    private Float deviceMemory;

    /**
     * CPU 核心数
     */
    @ExcelProperty("CPU核心数")
    @ColumnWidth(10)
    private Integer hardwareConcurrency;

    /**
     * 屏幕信息
     * 使用 transient 关键字忽略原始对象，通过自定义 Getter 方法将其转换为字符串。
     */
    @ExcelProperty("屏幕信息")
    @ColumnWidth(40)
    private String screenInfoString;

    /**
     * 原始的 ScreenInfoDto 对象，标记为 transient，EasyExcel 会忽略此字段。
     */
    private transient ScreenInfoDto screenInfo;

    /**
     * 自定义 Getter 方法，将 ScreenInfoDto 对象转换为易于阅读的字符串。
     * EasyExcel 会调用此方法来填充 "屏幕信息" 列。
     * @return 格式化后的屏幕信息字符串
     */
    public String getScreenInfoString() {
        if (this.screenInfo != null) {
            return String.format("宽:%d, 高:%d, 可用宽:%d, 可用高:%d, 色深:%d",
                    this.screenInfo.getWidth(),
                    this.screenInfo.getHeight(),
                    this.screenInfo.getAvailWidth(),
                    this.screenInfo.getAvailHeight(),
                    this.screenInfo.getColorDepth());
        }
        return "";
    }

    /**
     * 设置 ScreenInfoDto 对象，同时更新 screenInfoString 字段。
     * 在数据转换时调用此方法。
     * @param screenInfo ScreenInfoDto 对象
     */
    public void setScreenInfo(ScreenInfoDto screenInfo) {
        this.screenInfo = screenInfo;
        // 可选：也可以在这里同步设置 screenInfoString，但通常由 Getter 方法动态生成
        // this.screenInfoString = this.getScreenInfoString();
    }

    @ExcelProperty("图片路径")
    @ColumnWidth(50)
    private String imageUrl;

    /**
     * ip封禁标识
     * 导出时转换为 "是" 或 "否"，提升可读性。
     */
    @ExcelProperty("IP封禁标志")
    @ColumnWidth(10)
    private String banIpFlag;

    /**
     * 设备封禁标识
     * 导出时转换为 "是" 或 "否"，提升可读性。
     */
    @ExcelProperty("设备封禁标志")
    @ColumnWidth(10)
    private String banVictimFlag;

    /**
     * 自定义 Getter 方法，将 Integer 类型的 banIpFlag 转换为 "是" 或 "否"。
     * @return "是" 或 "否"
     */
    public String getBanIpFlag() {
        if (this.banIpFlag != null && this.banIpFlag.equals("1")) {
            return "是";
        }
        return "否";
    }

    /**
     * 自定义 Getter 方法，将 Integer 类型的 banVictimFlag 转换为 "是" 或 "否"。
     * @return "是" 或 "否"
     */
    public String getBanVictimFlag() {
        if (this.banVictimFlag != null && this.banVictimFlag.equals("1")) {
            return "是";
        }
        return "否";
    }

    /**
     * 设置封禁标识（IP），接收原始的 Integer 类型并转换为 String。
     * @param banIpFlag Integer 类型的封禁标识 (1: 封禁, 0: 未封禁)
     */
    public void setBanIpFlag(Integer banIpFlag) {
        if (banIpFlag != null) {
            this.banIpFlag = banIpFlag.toString();
        } else {
            this.banIpFlag = "0";
        }
    }

    /**
     * 设置封禁标识（用户），接收原始的 Integer 类型并转换为 String。
     * @param banVictimFlag Integer 类型的封禁标识 (1: 封禁, 0: 未封禁)
     */
    public void setBanVictimFlag(Integer banVictimFlag) {
        if (banVictimFlag != null) {
            this.banVictimFlag = banVictimFlag.toString();
        } else {
            this.banVictimFlag = "0";
        }
    }
}